#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 
#include <fcntl.h> 
#include <errno.h>
#include <string.h>

#define MSG_TRY "try again\n"


int main()
{

    char buf[10];
    int flags, n;

    flags = fcntl(STDIN_FILENO, F_GETFL); // 获取 stdin 的属性信息

    if (flags == -1) {
        perror("fcntl error");
        exit(1);
    }

    flags |= O_NONBLOCK; // 或操作说明一定给 flags 加上了非阻塞状态，因为或的话每个对应位置一定会加上1
    
    int ret = fcntl(STDIN_FILENO, F_SETFL, flags);
    if (ret == -1) {
        perror("fcntl error");
        exit(1);
    }

tryagain:
    
    n = read(STDIN_FILENO, buf, 10);
    if (n < 0) {
        if (errno != EAGAIN) {
            perror("read /dev/tty");
            exit(1);
        } 
        sleep(2);
        write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
        goto tryagain;
        
    }

    write(STDOUT_FILENO, buf, n);
    
    return 0;
}